Yarn v2 環境で Prisma が動かない
TL;DR
/prisma/client に client を出力
code:schema.prisma
generator client {
provider = "prisma-client-js"
output = "./client"
}
/prisma/client を ignore
code:gitignore
prisma/client
.prisma を @prisma/client の dependencies に追加
code:.yarnrc.yml
packageExtensions:
'@prisma/client@*':
dependencies:
'.prisma': 'link:See "resolution" field of package.json'
depedencies に @prisma/client 、devDependencies に prisma
resolutions で @prisma/client/.prisma を prisma にリンク
code: package.json
{
"dependencies": {
"@prisma/client": "2.19.0"
},
"devDependencies": {
"prisma": "^2.19.0"
},
"resolutions": {
"@prisma/client/.prisma": "link:prisma"
}
}
コードでは @prisma/client を import する
code:index.ts
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()
問題その1
dependencies に prisma を入れると devDependencies に入れ直そうとして失敗し続ける
正しい構成は dependencies に @prisma/client 、devDependencies に prisma を入れる
もしかしたら prisma は devDependencies に入れず yarn dlx prisma でもいいかもしれない(分からん)
code:package.json
{
"dependencies": {
"@prisma/client": "2.19.0"
},
"devDependencies": {
"prisma": "^2.19.0"
}
}
問題その2
generator が何もしないと /node_modules に client を吐くのだが、相対パスが間違っている
これによって SQLite は DB ファイルを見つけられなくなり、こける
PnP の関係で generator は /.yarn/unplugged 以下で動いているが、実行時は / で動くのでパスが狂う
対処は output を適当に設定してあげる
code:schema.prisma
generator client {
provider = "prisma-client-js"
output = "./client"
}
ignore して
code:gitignore
prisma/client
吐かれた client を import する
code:index.ts
import { PrismaClient } from '../prisma/client'
export const prisma = new PrismaClient()
問題その3
↑で output を適当に設定すると、トランスパイルは通るけどビルドに失敗する
generator が吐く client は @prisma/client にオーバーレイしないと動かないので
対処は吐かれた client を @prisma/client の dependency にする
code:.yarnrc.yml
packageExtensions:
'@prisma/client@*':
dependencies:
'.prisma': 'link:See "resolution" field of package.json'
実態へのリンクは package.json でやる
code:package.json
"resolutions": {
"@prisma/client/.prisma": "link:prisma"
}
本来なら /prisma/.prisma/client に吐かせて、link:prisma/.prisma にしたほうがいい
既存のまま吐かせるとそういうパスになるので
でもまあ問題ないっぽい